package com.neutech.maplestory.entity;

import com.neutech.maplestory.client.MapleStoryClient;
import com.neutech.maplestory.constant.Constant;

import java.awt.*;
import java.util.List;
import java.util.Random;

/**
 * @author Neuedu-远哥
 * @version 1.0
 * @date 2021/11/27 10:08
 */
public abstract class AbstractMapleStoryObject implements Moveable,Drawable{
    /**
     * 图片对象
     */
    public Image img;
    /**
     * x坐标
     */
    public int x;
    /**
     * y坐标
     */
    public int y;
    /**
     * 速度
     */
    public int speed;
    /**
     * 有效宽度
     */
    public int width;
    /**
     * 有效高度
     */
    public int height;
    /**
     * 表示方向的枚举类型
     */
    public Direction dir;
    /**
     * 表示动作的枚举类型
     */
    public Action action;

    public Image[] images;
    /**
     * 站的数组
     */
    public Image[] standImages;
    /**
     * 走的数组
     */
    public Image[] walkImages;
    /**
     * 射击的数组
     */
    public Image[] shootImages;
    /**
     * 跳的数组
     */
    public Image[] jumpImages;
    /**
     * 趴的数组
     */
    public Image[] proneImages;
    /**
     * 被打的数组
     */
    public Image[] hitImages;
    /**
     * 死亡数组
     */
    public Image[] dieImages;

    /**
     * 主类（客户端类）
     */
    public MapleStoryClient msc;
    /**
     * 类型
     */
    public int type;

    /**
     * 判断画第几张图片的变量
     */
    public int standStep, walkStep, shootStep,dieStep;

    /**
     * 切换图片的频率
     */
    public int rate;
    /**
     * 表示生死的变量
     */
    public boolean live = true;
    /**
     * 满血血量
     */
    public int HP;
    /**
     * 当前血量
     */
    public double hp;
    /**
     * 随机数生成器
     */
    public static Random r = new Random();
    /**
     * 表示方向的数组
     */
    public Direction[] dirs = Direction.values();
    /**
     * 表示动作的数组
     */
    public Action[] actions = Action.values();

    @Override
    public void move() {}

    @Override
    public void draw(Graphics g) {
        g.drawImage(img,x,y,null);
        move();
    }

    /**
     * 获取矩形的方法
     * @return 矩形对象
     */
    public Rectangle getRectangle(){
        return new Rectangle(x +msc.background.x,y,width,height);
    }

    private double v0 = Constant.HERO_JUMP_SPEED;
    public double vt = 0;
    private static final double G = 9.8;
    private double deltaHeight = 0.0;
    private static final double T = 0.5;

    /**
     * 表示掉落的变量，系统默认掉落为true值
     */
    public boolean drop = true;

    /**
     * 竖直上抛的方法
     * @param grounds 地面容器
     */
    public void jump(List<Ground> grounds){
        if(!drop){
            // 竖直上抛
            vt = v0 - G * T;
            v0 = vt;
            deltaHeight = v0 * T;
            this.y -= deltaHeight;
            if(vt <= 0){
                v0 = 0;
                vt = 0.0;
                deltaHeight = 0.0;
                drop = true;
            }
        }else{
            jumpDown(grounds);
        }
    }

    public boolean jump;
    /**
     * 自由落体的方法
     * @param grounds 地面容器
     */
    public void jumpDown(List<Ground> grounds){
        // 自由落体
        vt = v0 + G * T;
        v0 = vt;
        deltaHeight = v0 * T;
        this.y += deltaHeight;
        // 和地图上的每一个地面进行碰撞检测
        // 停止自由落体
        for(int i=0;i<grounds.size();i++) {
            Ground ground = grounds.get(i);
            if (this.getRectangle().intersects(ground.getRectangle()) && this.y < ground.y - this.height + this.vt) {

                if(this.y >= ground.y - this.height){
                    this.y = ground.y - this.height;
                    v0 = Constant.HERO_JUMP_SPEED;
                    vt = 0.0;
                    deltaHeight = 0.0;
                    drop = false;
                    jump = false;
                    return;
//                    break;
                }
            }
        }

    }
}
